// 存储工具函数，用于文件上传
import path from 'path'
import { promises as fs } from 'fs'

/**
 * 上传文件 - 所有文件都存储到本地
 * 支持需求 3.4
 * @param {File} file - 要上传的文件
 * @param {string} folder - 文件夹名称 ('apps' | 'thumbnails')
 * @returns {Promise<Object>} 上传结果 { path, url, error }
 */
export async function uploadFile(file, folder = 'apps') {
    try {
        // 所有文件都存储到本地服务器
        return await uploadToLocal(file, folder)
    } catch (error) {
        return {
            path: '',
            url: '',
            error: `上传错误: ${error instanceof Error ? error.message : '未知错误'}`
        }
    }
}

/**
 * 上传文件到本地服务器
 * @param {File} file - 要上传的文件
 * @param {string} folder - 文件夹名称
 * @returns {Promise<Object>} 上传结果
 */
async function uploadToLocal(file, folder) {
    try {
        // 生成唯一文件名
        const fileExt = file.name.split('.').pop()
        const fileName = `${Date.now()}-${Math.random().toString(36).substring(2)}.${fileExt}`
        const relativePath = `uploads/${folder}/${fileName}`

        // 确保上传目录存在
        const uploadDir = path.join(process.cwd(), 'public', 'uploads', folder)
        await fs.mkdir(uploadDir, { recursive: true })

        // 保存文件到本地
        const filePath = path.join(uploadDir, fileName)
        const buffer = Buffer.from(await file.arrayBuffer())
        await fs.writeFile(filePath, buffer)

        // 返回本地文件的公共 URL
        const publicUrl = `/uploads/${folder}/${fileName}`

        return {
            path: relativePath,
            url: publicUrl,
            error: undefined
        }
    } catch (error) {
        return {
            path: '',
            url: '',
            error: `本地上传失败: ${error.message}`
        }
    }
}



/**
 * 删除文件 - 删除本地文件
 * @param {string} filePath - 文件路径
 * @returns {Promise<boolean>} 删除成功返回 true
 */
export async function deleteFile(filePath) {
    try {
        // 删除本地文件
        const fullPath = path.join(process.cwd(), 'public', filePath)
        await fs.unlink(fullPath)
        return true
    } catch (error) {
        console.error('删除文件错误:', error)
        return false
    }
}

/**
 * 获取文件的公共 URL
 * @param {string} filePath - 文件路径
 * @returns {string} 公共 URL
 */
export function getFileUrl(filePath) {
    // 本地文件直接返回相对路径
    return `/${filePath}`
}

/**
 * 验证文件类型和大小
 * 支持需求 3.4 验证
 * @param {File} file - 要验证的文件
 * @param {string} type - 文件类型 ('app' | 'thumbnail')
 * @returns {string|null} 验证错误信息，无错误返回 null
 */
export function validateFile(file, type) {
    const maxSize = type === 'app' ? 100 * 1024 * 1024 : 5 * 1024 * 1024 // 应用 100MB，缩略图 5MB

    // 检查文件大小
    if (file.size > maxSize) {
        const maxSizeMB = maxSize / (1024 * 1024)
        return `文件大小必须小于 ${maxSizeMB}MB`
    }

    // 检查文件类型
    if (type === 'app') {
        const allowedTypes = [
            'application/x-msdownload', // .exe
            'application/octet-stream', // 通用二进制文件
            'application/zip',
            'application/x-zip-compressed'
        ]

        if (!allowedTypes.includes(file.type)) {
            return '应用程序只允许上传可执行文件 (.exe) 和压缩包'
        }
    } else if (type === 'thumbnail') {
        const allowedTypes = [
            'image/jpeg',
            'image/png',
            'image/webp',
            'image/gif'
        ]

        if (!allowedTypes.includes(file.type)) {
            return '缩略图只允许上传图片文件 (JPEG, PNG, WebP, GIF)'
        }
    }

    return null // 无验证错误
}

/**
 * 错误代码常量
 */
export const ERROR_CODES = {
    INVALID_FILE_TYPE: 'INVALID_FILE_TYPE',
    FILE_TOO_LARGE: 'FILE_TOO_LARGE',
    UPLOAD_FAILED: 'UPLOAD_FAILED',
    PRODUCT_NOT_FOUND: 'PRODUCT_NOT_FOUND',
    VALIDATION_ERROR: 'VALIDATION_ERROR'
}